package xuecheng.spring.boot.start.common.http;

import com.google.common.collect.Maps;
import org.springframework.util.ObjectUtils;
import xuecheng.spring.boot.start.common.http.impl.HttpUtilsOkHttp3Impl;

import java.util.Map;

/**
 * 网络请求工具类工厂类
 *
 * @author PengXueCheng
 * @version 1.0.0
 * @mail yingcheng1016@gmail.com
 * @date 2019/4/25 10:52
 * @desc
 */
public class HttpUtilsFactory {

    /**
     * 享元模式的元素存放处
     */
    private static final Map<String, HttpUtils> CONTEXT = Maps.newHashMap();

    /**
     * 获取网络请求工具类
     *
     * @param type        网络请求工具类类型(@see {@link HttpUtilsTypeEnum})
     * @param callTimeout 完整调用的默认超时(单位为毫秒) 为空则不设置
     * @return 网络请求工具类
     */
    public static HttpUtils getHttpUtils(HttpUtilsTypeEnum type, Integer callTimeout) {
        HttpUtils httpUtils = CONTEXT.get(type.name() + "-" + callTimeout);
        if (!ObjectUtils.isEmpty(httpUtils)) {
            return httpUtils;
        }
        switch (type) {
            case OKHTTP3:
                httpUtils = new HttpUtilsOkHttp3Impl(callTimeout);
            default:
                break;
        }
        CONTEXT.put(type.name() + "-" + callTimeout, httpUtils);
        return httpUtils;
    }

    /**
     * 获取网络请求工具类
     *
     * @param callTimeout 完整调用的默认超时(单位为毫秒)
     * @return 网络请求工具类
     */
    public static HttpUtils getHttpUtils(Integer callTimeout) {
        return getHttpUtils(HttpUtilsTypeEnum.OKHTTP3, callTimeout);
    }

    /**
     * 获取网络请求工具类(没有显示设置超时)
     *
     * @return 网络请求工具类
     */
    public static HttpUtils getHttpUtils() {
        return getHttpUtils(HttpUtilsTypeEnum.OKHTTP3, null);
    }

}
